package com.zsq.thread.test3;

/**
 * @author : zhang sq
 * @date : 2019/12/25 22:41
 **/
//todo 程序在执行过程中 ,如果出现异常 ,默认情况下锁会被释放
//所以,在并发处理的过程中,有异常需要多加小心,不然可能会发生不一致的情况
//比如: 在web app 处理过程中,多个servlet线程共同访问同一个资源,这时如果异常处理不合适
//在第一个线程抛出异常,其他线程就会进入同步代码区,有可能访问到异常产生的数据
//因此要非常小心的处理同步业务逻辑中的异常
//todo 执行时间短(加锁代码),线程数少 ,用自旋锁
//todo 执行时间长,线程数多,用系统锁
public class ThrowLock {

    int count=0;
    synchronized void m(){
        System.out.println(Thread.currentThread().getName()+"start");
        while (true){
            count++;
            System.out.println(Thread.currentThread().getName()+" count= "+count);
            try {
               Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }
            if(count==5){
                    int i=1/0; //此处抛出异常.锁将被释放,可以在这里进行catch,然后循环继续
                    System.out.println(i);
                }
//            try {
//                if(count==5){
//                    int i=1/0; //此处抛出异常.锁将被释放,可以在这里进行catch,然后循环继续
//                    System.out.println(i);
//                }
//            } catch (Exception e) {
//                e.printStackTrace();
//                continue;
//            }
            if(count>10){
                return;
            }
        }
    }

    public static void main(String[] args) {
        ThrowLock lock=new ThrowLock();
        Runnable r=new Runnable(){
            @Override
            public void run() {
                lock.m();
            }
        };
        new Thread(r,"t1").start();
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        new Thread(r,"t2").start();
    }

}
